\documentclass{article}
\usepackage{CJKutf8}
%\usepackage{type1cm}
\usepackage{color}
\usepackage{array}
\usepackage{amssymb}
\usepackage[margin=1cm,top=1cm,bottom=2cm]{geometry}
\newcommand{\blue}[1]{\textcolor{blue}{#1}}
\newcommand{\red}[1]{\textcolor{red}{#1}}
\begin{document}
\begin{CJK}{UTF8}{uyhei}
\begin{CJK}{UTF8}{gkai}
\end{CJK}
\textcolor[rgb]{1,0,0}{\begin{math} \end{math} \begin{math}			\end{math}} \\[0cm]
\textbf{练习题1.1}\\[0.1cm]
A\\[0.1cm]
原先需要的时间25h \\[0.1cm]
改变的时间中，原先需要的时间15h \\[0.1cm]
改变的时间中，现在需要的时间10h \\[0.1cm]
节省的时间5h
加速比25/20=5/4=1.25 \\[0.3cm]
B\\[0.1cm]
原先需要的时间 (\begin{math} T_{old} \end{math} )\ 25h \\[0.3cm]
\begin{math} \frac{\textstyle T_{old}}{\textstyle T_{new}}=1.67 \end{math} \\[0.3cm]
\begin{math} T_{new}=\frac{T_{old}}{1.67}=\frac{25}{1.67}=14.97h \approx{}15h  \end{math} \\[0.3cm]
节省的时间10h \\[0.1cm]
原先通过蒙大拿需要的时间15h \\[0.1cm]
现在需要的时间5h \\[0.1cm]
现在的速度1500/5=300km/h \\[0.3cm]
\textbf{练习题1.2} \\[0.2cm]
\begin{math} \frac{\textstyle T_{old}}{\textstyle T_{new}}=2 \end{math}\\[0.2cm]
\begin{math} T_{new}=T_{old}/2 \end{math}\\[0.2cm]
节省的时间
\begin{math} T_{omit}=T_{old}-T_{new}=T_{old}/2 \end{math}\\[0.2cm]
\begin{math} k=\frac{0.8T_{old}}{0.8T_{old}-T_{omit}}=8/3=2.67 \end{math}\\[0.3cm]
\textbf{练习题2.1} \\[0.1cm]
\textbf{A} \ 001110011010011111111000 \\[0.1cm]
\textbf{B} \ C97B \\[0.1cm]
\textbf{C} \ 11010101111001001100 \\[0.1cm]
\textbf{D} \ 26E7B5 \\[0.7cm]
\textbf{练习题2.2}
\begin{tabbing}
xxxxx	\=	xxxxxxxxxxxxxx		\=	xxxxxxxxxxxxxxx	\kill
n	\>	$2^n$(十进制)  		\>	$2^n$(十六进制) 		\\
9	\>	512			\>	0x200				\\
19	\>	\textcolor{blue}{524288}	\>	\textcolor{blue}{0x80000}	\\
\textcolor{blue}{14}	\>	16384			\>	\textcolor{blue}{0x4000}				\\
\textcolor{blue}{16}	\>	\textcolor{blue}{65536} 			\>	0x10000				\\
17	\>	\textcolor{blue}{131072}	\>	\textcolor{blue}{0x20000}	\\
\textcolor{blue}{5}	\>	32	\>	\textcolor{blue}{0x20}		\\
\textcolor{blue}{7}	\>	\textcolor{blue}{128}			\>	0x80				
\end{tabbing} 
\ \\[0.2cm]
\textbf{练习题2.3}
\begin{tabbing}
	xxxxxxx	\=	xxxxxxxxxx	\=	xxxxxxxxx	\kill
	十进制	\>	二进制	\>	十六进制	\\
	0	\>	0000 0000	\>	0x00	\\
	167	\>	\textcolor{blue}{1010 0111} 	\>	\textcolor{blue}{0xA7} 	\\
	62	\>	\textcolor{blue}{11 1110}  	\>	\textcolor{blue}{0x3E} 	\\
	188	\>	\textcolor{blue}{1011 1100} 	\>	\textcolor{blue}{0xBC}			\\
	\textcolor{blue}{55}	\>	0011 0111	\>	\textcolor{blue}{0x37}	\\
	\textcolor{blue}{136}	\>	1000 1000	\>	\textcolor{blue}{0x88}	\\
	\textcolor{blue}{243}	\>	1111 0011	\>	\textcolor{blue}{0xF3}	\\
	\textcolor{blue}{82}	\>		\textcolor{blue}{0101 0010}	\>	0x52	\\
	\textcolor{blue}{172}	\>		\textcolor{blue}{1010 1100}	\>	0xAC	\\
	\textcolor{blue}{231}	\>		\textcolor{blue}{1110}	\>	0xE7	\\
\end{tabbing}
\textbf{练习题2.4} \\[0.2cm]
\textbf{A.} 0x5044 \\
\textbf{B.} 0x4FFc \\
\textbf{C.} 0x503c+64=0x503c+0x40=0x507c \\
\textbf{D.} 0xae
\ \\[0.5cm]
\textbf{练习题2.5} \\
\textbf{A.}
小端法:21
大端法:87 \\
\textbf{B.}
小端法: \\ 21 \\ 43 \\
大端法: \\ 87 \\ 65 \\
\textbf{C.}
小端法: \\ 21 \\ 43 \\ 65 \\
大端法: \\ 87 \\ 65 \\ 43 \\[0.5cm]
\textbf{练习题2.6}
\textbf{A.} \\ 0x00359141二进值表示0000 0000 0011 0101 1001 0001 0100 0001 \\
0x4A564504二进制表示0100 1010 0101 0110 0100 0101 0000 0100 \\
\textbf{B.}\ 有22位相匹配 \\
00000000001101011001000101000001 \\
\hspace*{1em}01001010010101100100010100000100 \\
\hspace*{5.5em}********************* \\
\textbf{C.}\ 串的开头和结尾不匹配 \\[3ex]
\textbf{练习题2.7} \\
输出结果为: \\
61 \\ 62 \\ 63 \\ 64 \\ 65 \\ 66 \\ 00 \\[3ex]
\textbf{练习题2.8} \\
\begin{tabbing}
	xxxxxxx		\= 	xxxxxxxxxxxx	\kill
	运算		\> 	[01101001]	\\
	a		\>	[01010101]	\\
	b		\>	[01010101]	\\
	~a		\>	\textcolor{blue}{[10010110]}	\\
	~b		\>	\textcolor{blue}{[10101010]}	\\
	a\&b		\>	\textcolor{blue}{[01000001]}	\\
	a$|$b		\>	\textcolor{blue}{[01111101]}	\\
	a\^{}b		\>	\textcolor{blue}{[00111100]}	\\
\end{tabbing}
\textbf{练习题2.9} \\
\textbf{A.}\\
\hspace*{1em} 黑色的补:		111	\\
\hspace*{1em} 蓝色的补:		110	\\
\hspace*{1em} 绿色的补:		101	\\
\hspace*{1em} 蓝绿色的补:	100	\\
\hspace*{1em} 红色的补:		011	\\
\hspace*{1em} 红紫色的补:	010	\\
\hspace*{1em} 黄色的补:		001	\\
\hspace*{1em} 白色的补:		000	\\
\textbf{B.}\\
\hspace*{1em}		蓝色 $|$ 绿色 = [001] $|$ [010] = [011] = 蓝绿色	\\
\hspace*{1em}		黄色 \& 蓝绿色 = [110] \& [011] = [010] = 绿色		\\
\hspace*{1em}		红色 \^{} 红紫色 = [100] \^{} [101] = [001] = 蓝色 \\[3ex]
\textbf{练习题2.10}
\begin{tabbing}
	xxxxxxxx	\=	xxxx	\=	xxxx	\kill
	步骤		\>	*x	\>	*y	\\
	初始		\>	a	\>	b	\\
	第1步		\>	\textcolor{blue}{a}	\>	\textcolor{blue}{a\^{}b}	\\
	第2步		\>	\textcolor{blue}{b}	\>	\textcolor{blue}{a\^{}b}	\\
	第3步		\>	\textcolor{blue}{b}	\>	\textcolor{blue}{a}	\\
\end{tabbing}
\textbf{练习题2.11}	\\
\textbf{A.}\  变量first和last的值都是k	\\
\textbf{B.}\ 此时first和last的值相同，都指向同一内存地址单元，第一步x\^{}y相当于此内存地址中的内容与自己异或，然后再将异或的值存放到此内存地址单元中，由a\^{}a=0，可知第一步后，内存单元中的值为0，此后相当于一直在运算0\^{}0,因此无论怎样，此内存地址中的值就一直为0了。\\
\textbf{C.}\ reverse\_array第四行``$<$=''改为``$<$'' \\[2ex]
\textbf{练习题2.12}	\\
\textbf{A.}\ x\&0xFF	\\
\textbf{B.}\ x\^{}(\~{}0xFF)	\\
\textbf{C.}\ x$|$0xFF	\\[2ex]
\textbf{练习题2.13}\\
bis(x,y)\\
bis(bic(x,y),bic(y,x))\\[3ex]
\textbf{练习题2.14}
\begin{tabbing}
	xxxxxxxxxx	\=	xxxxxxxxxxx	\=	xxxxxxxxxxxx	\=	xxxxxxxxxxx	\kill
	表达式		\>	值		\>	表达式	\>	值	\\[1ex]
	x \& y		\>	\textcolor{blue}{0x20}		\>	x \&\& y	\>	0x01	\\[1ex]
	x $|$ y		\>	\textcolor{blue}{0x7F}		\>	x $|$$|$ y	\>	\textcolor{blue}{0x01}		\\[1ex]
	\~{}x $|$ \~{}y	\>	\textcolor{blue}{0xDF}		\>	!x $|$$|$ !y	\>	\textcolor{blue}{0x00}	\\[1ex]
	x \& !y		\>	\textcolor{blue}{0x00}		\>	x \&\& \~{}y	\>	\textcolor{blue}{0x01}	\\[1ex]
\end{tabbing}
\textbf{练习题2.15}\\
!x\^{}y \\[3ex]
\textbf{练习题2.16}
\begin{tabbing}
	xxxxxxxxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxxxxxxxx	\kill
	\hspace{4em}x		\>	\hspace{2em} x$<<$3		\>		\hspace{2em}x$>>$2(逻辑的)	\>		\hspace{2em} x$>>$2(算术的)	\\
	十六进制\hspace{2em}二进制	\>	二进制\hspace{2em}十六进制\>	二进制\hspace{2em}十六进制\>	二进制\hspace{2em}十六进制\\[2ex]
	0xC3	\hspace{2em}\textcolor{blue}{1100 0011}		\>	\textcolor{blue}{0001 1000}	\hspace{2em}\textcolor{blue}{0x18}	\>	\textcolor{blue}{0011 0000}	\hspace{2em} \textcolor{blue}{0x30}	\>	\textcolor{blue}{1111 0000}	\hspace{2em}\textcolor{blue}{0xF0}	\\
	0x75	\hspace{2em} \textcolor{blue}{0111 0101}		\>	\textcolor{blue}{1010 1000} \hspace{2em}\textcolor{blue}{0xA8}	\>	\textcolor{blue}{0001 1101}	\hspace{2em} \textcolor{blue}{0x1D}	\>	\textcolor{blue}{0001 1101}	\hspace{2em}\textcolor{blue}{0x1D}	\\
	0x87	\hspace{2em} \textcolor{blue}{1000 0111}		\>	\textcolor{blue}{0011 1000} \hspace{2em}\textcolor{blue}{0x38}	\>	\textcolor{blue}{0010 0001}	\hspace{2em} \textcolor{blue}{0x21}	\>	\textcolor{blue}{1110 0001}	\hspace{2em}\textcolor{blue}{0xE1}	\\
	0x66	\hspace{2em} \textcolor{blue}{0110 0110}		\>	\textcolor{blue}{0011 0000} \hspace{2em}\textcolor{blue}{0x30}	\>	\textcolor{blue}{0001 1001}	\hspace{2em} \textcolor{blue}{0x19}	\>	\textcolor{blue}{0001 1001}	\hspace{2em}\textcolor{blue}{0x19}	\\
\end{tabbing}
\textbf{练习题2.17}
\begin{tabbing}
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxx	\kill
	\hspace{5em}$\vec{x}$	\>	\hspace{2em}$B2U_4(\vec{x})$	\>		\hspace{3em}$B2T_4(\vec{x})$	\\
	十六进制 \hspace{2em}	二进制	\>		\>	\\[2ex]
	\hspace{1em}0xE	\hspace{3.5em}[1110]	\>	$2^3+2^2+2^1=14$	  \>		$-2^3+2^2+2^1=-2$	\\
	\hspace{1em}0x0 \hspace{3.7em}\textcolor{blue}{[0000]}	\>	\hspace{3em}\textcolor{blue}0		\>	\hspace{4em}\textcolor{blue}0	\\
	\hspace{1em}0x5	\hspace{3.7em}\textcolor{blue}{[0101]}	\>	\textcolor{blue}{$2^2+2^0=5$}		\>	\textcolor{blue}{$2^2+2^0=5$}		\\
	\hspace{1em}0x8	\hspace{3.7em}\textcolor{blue}{[1000]}	\>	\textcolor{blue}{$2^3=8$}		\>	\textcolor{blue}{$-2^3=-8$}		\\
	\hspace{1em}0xD	\hspace{3.4em}\textcolor{blue}{[1101]}	\>	\textcolor{blue}{$2^3+2^2+2^0=13$}	\>	\textcolor{blue}{$-2^3+2^2+2^0=-3$}	\\
	\hspace{1em}0xF	\hspace{3.5em}\textcolor{blue}{[1111]}	\>	\textcolor{blue}{$2^3+2^2+2^1+2^0=15$}	\>	\textcolor{blue}{$-2^3+2^2+2^1+2^0=-1$}	\\[1ex]
\end{tabbing}
\textbf{练习题2.18}\\[1ex]
\textbf{A.}\ 736 	\\
\textbf{B.}\ 88 	\\
\textbf{C.}\ 40		\\
\textbf{D.}\ 48		\\
\textbf{E.}\ 120	\\
\textbf{F.}\ -120	\\
\textbf{G.}\ 504	\\
\textbf{H.}\ -64	\\
\textbf{I.}\ 72		\\[5ex]
\textbf{练习题2.19}
\begin{tabbing}
	xxxxxxxx	\=	xxxxxxxxxxxxx		\kill
	x		\>	$T2U_4(x)$		\\
	-8		\>	\textcolor{blue}{8}	\\
	-3		\>	\textcolor{blue}{13}	\\
	-2		\>	\textcolor{blue}{14}	\\
	-1		\>	\textcolor{blue}{15}	\\
	0		\>	\textcolor{blue}{0}	\\
	5		\>	\textcolor{blue}{5}	\\
\end{tabbing}
\textbf{练习题2.21}
\begin{tabbing}
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxxx		\=	xxxxxxx	\kill
	表达式					\>	类型			\>	求值				\\[0.5ex]
	-2147483647-1 == 2147483648U		\>	\textcolor{blue}{无符号}	\>	\textcolor{blue}1	\\
	-2147483647-1 $<$  2147483647		\>	\textcolor{blue}{有符号}	\>	\textcolor{blue}1	\\
	-2147483647-1U$<$  2147483647		\>	\textcolor{blue}{无符号}	\>	\textcolor{blue}0	\\
	-2147483647-1 $<$  -2147483647		\>	\textcolor{blue}{有符号}	\>	\textcolor{blue}1	\\
	-2147483647-1U$<$  -2147483647		\>	\textcolor{blue}{无符号}	\>	\textcolor{blue}1	\\
\end{tabbing}
\textbf{练习题2.22}\\
\textbf{A.}\ $-2^{3}+2+1=-5$ \\
\textbf{B.}\ $-2^{4}+2^3+2+1=-5$ \\
\textbf{C.}\ $-2^5+2^4+2^3+2+1=-5$ \\[3ex]
\textbf{练习题2.23}\\
\textbf{A.}
\begin{tabbing}
	xxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxxxx	\kill
	w			\>	fun1(w)			\>	fun2(w)		\\
	0x00000076		\>	\textcolor{blue}{118}	\>	\textcolor{blue}{118}	\\
	0x87654321		\>	\textcolor{blue}{33}	\>	\textcolor{blue}{33}	\\
	0x000000C9		\>	\textcolor{blue}{201}	\>	\textcolor{blue}{-3639}	\\
	0xEDCBA987		\>	\textcolor{blue}{135}	\>	\textcolor{blue}{-3705}	\\
\end{tabbing}
\clearpage
\noindent\textbf{B.}\\ 
fun1将无符号整型逻辑左移24位，再逻辑右移24位，再转为有符号整形.\\
fun2将无符号整型转为有符号整型，再逻辑左移24位，再算术右移24位.\\[3ex]
\textbf{练习题2.24}
\begin{tabbing}
	xxxxxxxxxxxxxxxxxxx	\=	xxxxxxxxxxxxxxxxxxx			\=	xxxxxxxxxxxxxxxxxxx	\kill
	\hspace{2em}十六进制	\>	\hspace{2.5em}无符号			\>	\hspace{3em}补码			\\
	原始值\hspace{2em}截断值\>	原始值\hspace{2em}截断值\>	原始值\hspace{2em}截断值\\[1ex]
	0\hspace{5em}0		\>	0\hspace{5em}\textcolor{blue}{0}	\>	0\hspace{5em}\textcolor{blue}{0}	\\
	2\hspace{5em}2		\>	2\hspace{5em}\textcolor{blue}{2}	\>	2\hspace{5em}\textcolor{blue}{2}	\\
	9\hspace{5em}1		\>	9\hspace{5em}\textcolor{blue}{1}	\>	-7\hspace{5em}\textcolor{blue}{1}	\\
	B\hspace{5em}3		\>	11\hspace{5em}\textcolor{blue}{3}	\>	-5\hspace{5em}\textcolor{blue}{3}	\\
	F\hspace{5em}7		\>	15\hspace{5em}\textcolor{blue}{7}	\>	-1\hspace{5em}\textcolor{blue}{-1}	\\
\end{tabbing}
\textbf{练习题2.28}
\begin{tabbing}
	xxxxxxxxxxxx	\=	xxxxxxxxxxxx	\=	xxxxxxxxxxxx	\=	xxxxxxxxxxxx	\kill
			\>	x		\>			\>	$-^u_4x$	\\
	\hspace{1.5em}十六进制	\>	\hspace{1.5em}十进制		\>	\hspace{2.5em}十进制		\>	\hspace{2.5em}十六进制	\\
	\hspace{3em}0	\>	\hspace{2.5em}0	\>	\hspace{3.5em}0	\>	\hspace{4em}0	\\
	\hspace{3em}5	\>	\hspace{2.5em}5	\>	\hspace{3.5em}11\>	\hspace{4em}B	\\
	\hspace{3em}8	\>	\hspace{2.5em}8	\>	\hspace{3.5em}8	\>	\hspace{4em}8	\\
	\hspace{3em}D	\>	\hspace{2.5em}13\>	\hspace{3.5em}3	\>	\hspace{4em}3	\\
	\hspace{3em}F	\>	\hspace{2.5em}15\>	\hspace{3.5em}1	\>	\hspace{4em}1	\\
\end{tabbing}
\textbf{练习题2.29}
\begin{tabbing}
	xxxxxxxxxxxxxxx					\=	xxxxxxxxxxxxxxx					\=	xxxxxxxxxxxxxxx 					\=	xxxxxxxxxxxxxxx				\=	xxxxxxxxxxxxxxx				\kill
	\hspace{4em}x					\>	\hspace{4em}y					\>	\hspace{3em}x+y						\>	\hspace{2em}$x+^t_5y$			\>	\hspace{2em}情况			\\
	$[10100]$\hspace{2em}\textcolor{blue}{-12}	\>	$[10001]$\hspace{2em}\textcolor{blue}{-15}	\>	\textcolor{blue}{$[100101]$\hspace{2em}-27}		\>	\textcolor{blue}{[00101]\hspace{2em}5}	\>	\hspace{3em}\textcolor{blue}1		\\
	$[11000]$\hspace{2em}\textcolor{blue}{-8}	\>	$[11000]$\hspace{2em}\textcolor{blue}{-8}	\>	\textcolor{blue}{$[110000]$\hspace{2em}-16}		\>	\textcolor{blue}{[10000]\hspace{2em}-16}\>	\hspace{3em}\textcolor{blue}2		\\
	$[10111]$\hspace{2em}\textcolor{blue}{-9}	\>	$[01000]$\hspace{2em}\textcolor{blue}{8}	\>	\textcolor{blue}{$[111111]$\hspace{2em}-1}		\>	\textcolor{blue}{[11111]\hspace{2em}-1}	\>	\hspace{3em}\textcolor{blue}2		\\
	$[00010]$\hspace{2em}\textcolor{blue}{2}	\>	$[00101]$\hspace{2em}\textcolor{blue}{5}	\>	\textcolor{blue}{$[000111]$\hspace{2em}7}		\>	\textcolor{blue}{[00111]\hspace{2em}7}	\>	\hspace{3em}\textcolor{blue}3		\\
	$[01100]$\hspace{2em}\textcolor{blue}{12}	\>	$[00100]$\hspace{2em}\textcolor{blue}{4}	\>	\textcolor{blue}{$[010000]$\hspace{2em}16}		\>	\textcolor{blue}{[10000]\hspace{2em}-16}\>	\hspace{3em}\textcolor{blue}4		\\[1ex]
\end{tabbing}
\textbf{练习题2.31}	\\[2ex]
根椐补码加法的公式(2.13),可知当发生正溢出时，$sum=x+y-2^w$,此时$sum-x=y-2^w$,由于y是有符号整数，因此$y-2^w=y$；发生负溢出时，同理。因此，该同事的代码在发生溢出时，返回的值为1,显然，他的这段代码达不到我们的功能要求.	\\[3ex]
\textbf{练习题2.32}	\\[2ex]
$y=TMIN=-2^{31}$,x取任何值时;函数都会产生错误的结果	\\[3ex]
\textbf{练习题2.33}	\\[1ex]
\begin{tabular}[t]{cc|cc}
	\hline
	\multicolumn{2}{c}{$x$}				&	\multicolumn{2}{c}{$-_4^tx$}				\\
	\hline
	十六进制	&	十进制			&	十进制			&	十六进制		\\
	\hline
	0		&	\textcolor{blue}0	&	\textcolor{blue}0	&	\textcolor{blue}{0}	\\
	\hline
	5		&	\textcolor{blue}5	&	\textcolor{blue}{-5}	&	\textcolor{blue}{B}	\\
	\hline
	8		&	\textcolor{blue}{-8}	&	\textcolor{blue}{-8}	&	\textcolor{blue}{8}	\\
	\hline
	D		&	\textcolor{blue}{-3}	&	\textcolor{blue}{3}	&	\textcolor{blue}{3}	\\
	\hline
	F		&	\textcolor{blue}{-1}	&	\textcolor{blue}{1}	&	\textcolor{blue}{1}	\\
	\hline
\end{tabular}\\[1ex]
同一个数字的补码和无符号非产生的位模式相同。	\\[3ex]
\textbf{练习题2.34}	\\[1ex]
\begin{tabular}[t]{|c|c|c|c|c|}
	\hline	\\[-2ex]
	模式	&	x	&	y	&	$x\cdot y$	&	截断的$x\cdot y$	\\
	\hline	\\[-2ex]
	无符号	&	\textcolor{blue}{4}\ [100]	&	\textcolor{blue}{5}\ [101]	&	\textcolor{blue}{20}\ \textcolor{blue}{[010100]}		&	\textcolor{blue}{4}\ \textcolor{blue}{[100]}			\\[1ex]
	补码	&	\textcolor{blue}{-4}\ [100]	&	\textcolor{blue}{-3}\ [101]	&	\textcolor{blue}{12}\ \textcolor{blue}{[001100]}			&	\textcolor{blue}{-4}\ \textcolor{blue}{[100]}			\\
	\hline	\\[-2ex]
	无符号	&	\textcolor{blue}{2}\ [010]	&	\textcolor{blue}{7}\ [111]	&	\textcolor{blue}{14}\ \textcolor{blue}{[001110]}		&	\textcolor{blue}{6}\ \textcolor{blue}{[110]}			\\[1ex]
	补码	&	\textcolor{blue}{2}\ [010]	&	\textcolor{blue}{-1}\ [111]	&	\textcolor{blue}{-2}\ \textcolor{blue}{[111110]}		&	\textcolor{blue}{-2}\ \textcolor{blue}{[110]}			\\
	\hline	\\[-2ex]
	无符号	&	\textcolor{blue}{6}\ [110]	&	\textcolor{blue}{6}\ [110]	&	\textcolor{blue}{36}\ \textcolor{blue}{[100100]}		&	\textcolor{blue}{4}\ \textcolor{blue}{[100]}			\\[1ex]
	补码	&	\textcolor{blue}{-2}\ [110]	&	\textcolor{blue}{-2}\ [110]	&	\textcolor{blue}{4}\ \textcolor{blue}{[000100]}		&	\textcolor{blue}{-4}\ \textcolor{blue}{[100]}			\\
	\hline
\end{tabular}\\[3ex]
\textbf{练习题2.35}	\\[1ex]
1)由前面的叙述可以知道，$p=x*\ _w^ty=U2T_w((x\cdot y)mod\ 2^w)=(x\cdot y)mod\ 2^w-p_{w-1}2^w$,我们可以用64位的二进制数来表示$x\cdot y$,此时有	\\
\begin{math}
	x\cdot y=a_{63}2^{63}+a_{62}2^{62}+\dots+a_22^2+a_12+a_0	\\
	(x\cdot y)mod\ 2^w=(x\cdot y)mod\ 2^{32}=x\cdot y-a_{63}2^{63}-a_{62}2^{62}-\dots-a_w2^w
\end{math}	\\
就有	\\
$p=(x\cdot y)mod\ 2^w-p_{w-1}2^w=x\cdot y-a_{63}2^{63}-a_{62}2^{62}-\dots-a_w2^w-p_{w-1}2^w	\\
=x\cdot y-(a_{63}2^{31}+a_{62}2^{30}+\dots+a_w+p_{w-1})2^w	\\
=x\cdot y-t2^w$	\\
$-2^{w-1}\le p<2^{w-1}$,当$-2^{w-1}\le x\cdot y<2^{w-1}$时,计算不溢出	\\
$<1>$当$0\le x\cdot y<2^{w-1}$时,$p=(x\cdot y)mod\ 2^w-p_{w-1}2^w=x\cdot y$	\\
$<2>$当$-2^{w-1}\le x\cdot y<0$时,$p=(x\cdot y)mod\ 2^w-p_{w-1}2^w	\\
=(-2^{63}+2^{62}+\dots+2^w+2^{w-1}+a_{w-2}2^{w-2}+a_{w-3}2^{w-3}+\dots+a_22^2+a_12+a_0)mod\ 2^w-2^w	\\
=-2^{w-1}+a_{w-2}2^{w-2}+a_{w-3}2^{w-3}+\dots+a_22^2+a_12+a_0	\\
=x\cdot y$	\\
因此$x\cdot y=p+t2^w$,当且仅当p的计算溢出时，$t\neq 0$	\\
2)q是整数，因此q为p除以x取整，有$p=x\cdot q+x\cdot ((p/x)mod 1)$,于是就有$p=x\cdot q+r$,其中$|r|<|x|$			\\
3)由1,2可知，$p=x*\ _w^ty=(x\cdot y)mod\ 2^w-p_{w-1}2^w$,\ $p=x\cdot q+x\cdot ((p/x)mod 1)$			\\ 
有		\\
$(x\cdot y)mod\ 2^w-p_{w-1}2^w=x\cdot q+x\cdot ((p/x)mod 1)$	\\
$x\cdot y=p+t2^w$	\\
$x\cdot q=p-r$,当y=q时,有$p+t2^{w}=p-r$,有$t2^{w}=-r$,又因为$|r|<|x|\le|2^{w-1}|$,因此,r=t=0,因此有$x\cdot y=p$,计算不溢出.	\\[3ex]
\textbf{练习题2.37}	\\[1ex]
A.将乘法值赋值给无符号64位类型变量，避免了乘法溢出	\\
B.判断asize是否能用无符号32位来表示，如能表示调用malloc函数分配内存;如不能，给出提示，退出	\\[3ex]
\textbf{练习题2.38}	\\[1ex]
\begin{math}
	(a<<k)+b=a*2^k+b
\end{math}\\
当b=0时,\ $(a<<k)+b=a*2^k,k=0,1,2,3$	\\
此时,$(a<<k)+b$可表示a的8,4,2,1倍	\\[1ex]
当b=a时,\ $(a<<k)+b=a*2^k+a=a*(2^k+1),k=0,1,2,3$	\\
此时,$(a<<k)+b$可表示a的9,5,3,2倍	\\[3ex]
\textbf{练习题2.39}	\\[1ex]
当位位置n为最高有效位时，形式B变为如下形式:	\\
\begin{math}
	(x<<(n+1))-(x<<m)=-(x<<m)	\\[3ex]
\end{math}
\textbf{练习题2.40}	\\[1ex]
\begin{tabular}[t]{|c|c|c|c|}
	\hline		\\[-2ex]
	K	&	移位	&	加法/減法	&	表达式	\\
	\hline		\\[-2ex]
	6	&	2	&	1		&	$(x<<3)-(x<<1)$	\\
	\hline		\\[-2ex]
	31	&	1	&	1		&	$(x<<5)-x$	\\
	\hline		\\[-2ex]
	-6	&	2	&	1		&	$-(x<<3)-(x<<1)$	\\
	\hline		\\[-2ex]
	55	&	2	&	2		&	$(x<<6)-(x<<3)-x$	\\
	\hline
\end{tabular}	\\[3ex]
\textbf{练习题2.41}	\\[1ex]
形式Ａ需要(n-m+1)次移位操作，需要(n-m)次加法操作	\\
形式Ｂ需要2次移位操作，需要１次减法操作	\\
可以看出形式B所做运算次数远小于形式A，因此编译器会使用形式B的方案	\\[3ex]
\textbf{练习题2.43}		\\[1ex]
M的值为31,N的值为8	\\[3ex]
\textbf{练习题2.44}	\\[1ex]
\textbf{A.}	\\
x是int型数值，因此$-2147483648\le x< 2147483648$	\\
当$x>0$时，$(x>0)||(x-1<0)$为真	\\
当$x\le 0$时,x的范围为$-2147483648<x\le 0$,有$-2147483648-1<x-1\le -1$, 因此$x-1<0$必成立	\\
综上，$(x>0)||(x-1<0)$必为真	\\
\textbf{B.} 	\\[1ex]
x是int型数值，因此$-2147483648\le x< 2147483648$	\\
\textbf{(1)} $(x\&7)!=7$为假	\\
此时应使$(x\&7)!=7$成立;	\\
当$(x\&7)=7$时，x的位表示为$\underbrace{***\dots***}_{29}111$(其中*表示0 or 1),因此$-2147483641=-x^{31}+7\le x< 2147483648$;	\\
要使$(x\&7)!=7$成立,应有$-2147483648\le x<-2147483641=-x^{31}+7$	\\
即当$-2147483648\le x<-2147483641=-x^{31}+7$时，$(x\&7)!=7$成立	\\
此时，x的位表示为:$\underbrace{***\dots***}_{29}111$,$x<<29$的位表示为$111\underbrace{000\dots00}_{29}$,因此，$x<<29<0$必为真	\\
因此，当$(x\&7)!=7$为假时，$(x<<29<0)$必为真，此时$(x\&7)!=7||(x<<29<0)$为真	\\
\textbf{(2)} 当$(x\&7)!=7$为真时，$(x\&7)!=7||(x<<29<0)$为真	\\
综上，$(x\&7)!=7||(x<<29<0)$必为真	\\
\textbf{C.}	\\
$x*\ _{32}^tx=U2T_{32}\left( (x*x)\ mod\ 2^{32} \right)$	\\
当$2^{ 31 }\le x*x<2^{ 32 }$时，$x*\ _{32}^tx<0$,此时$(x*x)\ge 0$为假	\\
\textbf{D.}	\\
\textbf{(1)} $x<0$为假,此时$x\ge 0$,$-x\le 0$必为真，此时$x<0 || -x\le 0$为真	\\
\textbf{(2)} $x<0$为真,此时$x<0 || -x\le 0$必为真	\\
综上，$x<0 || -x\le 0$为真	\\
\textbf{E.}	\\
\textbf{(1)} $x>0$为假，有$x\le 0$,则$-x\ge 0$成立,此时$x>0 ||-x\ge 0$为真	\\
\textbf{(2)} $x>0$为真,此时$x>0 ||-x\ge 0$为真	\\
综上，$x>0 ||-x\ge 0$为真	\\
\textbf{F.}	\\
由题可知
$x+\ _{32}^ty=U2T_{32}(ux+uy)$	\\
$ux+\ _{32}^uuy=( ux+uy ) mod\ 2^{32}$	\\
ux,uy是unsigned型，$0\le ux<2^{32}$,$0\le ux+uy<2^{33}$	\\
\textbf{(1)} 当$0\le ux+uy<2^{31}$时,$x+\ _{32}^ty=U2T_{32}(ux+uy)=ux+uy$,$ux+ _{32}^uuy=ux+uy$,此时$x+\ _{32}^ty=ux+\ _{32}^uuy$	\\
\textbf{(2)} 当$2^{31}\le ux+uy<2^{ 32 }$时，$x+\ _{32}^ty=U2T_{32}(ux+uy)=ux+uy-2^{32}$,$ux+\ _{32}^uuy=ux+uy$,此时，$x+\ _{32}^ty\ne ux+\ _{32}^uuy$	\\
\textbf{(3)} 当$2^{32}\le ux+uy<2^{33}$时，$x+\ _{32}^ty=U2T_{32}(ux+\ _{32}^uuy)=U2T_{32}(ux+uy-2^{32})$,$ux+\ _{32}^uuy=ux+uy-2^{32}$	\\
因为$0\le ux+uy-2^{32}<2^{32}$	\\
当$0\le ux+uy-2^{32}<2^{31}$时，$x+\ _{32}^ty=U2T_{32}(ux+uy-2^{32})=ux+uy-2^{32}$,$ux+\ _{32}^uuy=ux+uy-2^{32}$,此时$x+\ _{32}^ty=ux+\ _{32}^uuy$	\\
当$2^{31}\le ux+uy-2^{32}<2^{32}$时，$x+\ _{32}^ty=U2T_{32}(ux+uy-2^{32})=ux+uy-2^{32}-2^{32}=ux+uy-2^{33}$	\\
此时$2^{32}+2^{31}\le ux+uy<2^{33}$,$x+\ _{32}^ty\ne ux+\ _{32}^uuy$	\\
综上，当$2^{31}\le ux+uy<2^{32}$ and $2^{31}\le ux+uy<2^{33}$时，$x+\ _{32}^ty\ne ux+\ _{32}^uuy$,即$x+y == ux+uy$不成立	\\
\textbf{G.}	\\
\begin{math}
	x*\ _{32}^t\sim y+uy*\ _{32}^uux	\\
	=x*\ _{32}^t(-1-y)+ux*\ _{32}^uuy	\\
	=-x-x*\ _{32}^ty+ux*\ _{32}^uuy	\\
	=-x-U2T_{32}((x*y)mod\ 2^{32})+(ux*uy)mod\ 2^{32}
\end{math}\hspace{2em}由补码乘法和无符号乘法的位级等价性，有	\\
\begin{math}
	=-x-U2T_{32}\left ((ux*uy)mod\ 2^{32}\right )+(ux*uy)mod\ 2^{32}	\\
\end{math}
$0\le(ux*uy)mod\ 2^{32}<2^{32}$	\\
\textbf{(1)} 当$0\le(ux*uy)mod\ 2^{32}<2^{31}$时	\\
\begin{math}
	x*\ _{32}^t\sim y+ux*\ _{32}^uuy	\\
	=-x-U2T_{32}\left ((ux*uy)mod\ 2^{32}\right )+(ux*uy)mod\ 2^{32}	\\
	=-x-(ux*uy)mod\ 2^{32}+(ux*uy)mod\ 2^{32}	\\
	=-x
\end{math}	\\
\textbf{(2)} 当$2^{31}\le(ux*uy)mod\ 2^{32}<2^{32}$	\\
\begin{math}
	x*\ _{32}^t\sim y+ux*\ _{32}^uuy	\\
	=-x-U2T_{32}\left ((ux*uy)mod\ 2^{32}\right )+(ux*uy)mod\ 2^{32}	\\
	=-x-\left( (ux*uy)mod\ 2^{32}-2^{32}\right )+(ux*uy)mod\ 2^{32}	\\
	=-x-(ux*uy)mod\ 2^{32}+2^{32}+(ux*uy)mod\ 2^{32}	\\
	=-x+2^{32}	\\
\end{math}
综上，当$2^{31}\le(ux*uy)mod\ 2^{32}<2^{32}$时，$x*\sim y+uy*ux ==  -x$为假	\\[3ex]
\textbf{练习题2.45}	
\begin{table}[htbp]
	\centering
	\begin{tabular}{|l|c|r|}
		\hline
		小数值	&	二进制表示	&	十进制表示	\\
		\hline
		$\frac{1}{8}$	&	0.001	&	0.125	\\
		\hline
		$\frac{3}{4}$	&	\blue{0.11} &	\blue{0.75}		\\
		\hline
		$\frac{25}{16}$	&	\blue{1.1001}	&	\blue{1.5625}	\\
		\hline
		\blue{$\frac{43}{16}$}	&	10.1011	&	\blue{2.6875}	\\
		\hline
		\blue{ $\frac{9}{8}$ }		&	1.001	&	\blue{ 1.125 }\\
		\hline
		\blue{$\frac{47}{8}$}		&	\blue{ 101.01 }	&	5.875	\\
		\hline
		\blue{$\frac{51}{16}$}		&	\blue{11.0011}	&	3.1875	\\
		\hline
	\end{tabular}
\end{table}	\\
\textbf{练习题2.46}	\\
\textbf{A.} 	\\
\begin{math}
	0.1=0.000110011[0011][0011][0011][0011]\dots_2	\\
	  x=0.000110011 0011  0011  0011  00_2	\\
	  0.1-x=0.000000000 00000 00000 0000  0011 [0011]\dots_2
\end{math}	\\
\textbf{B.} 	\\
\begin{math}	
	x=0.000110011 0011  0011  0011  00_2=0.0999999046325684	\\
	0.1-x=0.1-0.0999999046325684=9.53674316045428\times10^{ -008 }
\end{math}	\\
\textbf{C.}	\\
\begin{math}	
	\Delta t=100*60*60*10*(0.1-x)=0.343322753776354(s)
\end{math}	\\
\textbf{D.}	\\
\begin{math}	
	\Delta x=2000*\Delta t=686.645507552708(m)
\end{math}	\\[3ex]
\newpage	

% 表格行距设置
\renewcommand\arraystretch{1.5}

\noindent\textbf{练习题2.47}	
\begin{table}[ht]
\centering
\begin{tabular}{|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|}
	\hline
	位	&	e	&	E	&	$2^e$	&	$f$	&	M	&	$2^E\times M$	&	V	&	十进制	\\
	\hline
	0 00 00	&	0	&	0	&	1	&	0	&	0	&	$1\times 0$	&	0	&	0	\\
	\hline
	0 00 01	&	0	&	0	&	1	&	$\frac{1}{4}$	&	$\frac{1}{4}$	&	$1\times \frac{1}{4}$	&	$\frac{1}{4}$	&	0.25	\\
	\hline
	0 00 10	&	0	&	0	&	1	&	$\frac{1}{2}$	&	$\frac{1}{2}$	&	$1\times \frac{1}{2}$	&	$\frac{1}{2}$	&	0.5	\\
	\hline
	0 00 11	&	0	&	0	&	1	&	$\frac{3}{4}$	&	$\frac{3}{4}$	&	$1\times \frac{3}{4}$	&	$\frac{3}{4}$	&	0.75	\\
	\hline
	0 01 00	&	1	&	0	&	1	&	0	&	1	&	$1\times 1$	&	1	&	1	\\
	\hline
	0 01 01	&	1	&	0	&	1	&	$\frac{1}{4}$	&	$\frac{5}{4}$	&	$1\times \frac{5}{4}$	&	$\frac{5}{4}$	&	1.25	\\
	\hline
	0 01 10	&	1	&	0	&	1	&	$\frac{1}{2}$	&	$\frac{3}{2}$	&	$1\times \frac{3}{2}$	&	$\frac{3}{2}$	&	1.5	\\
	\hline
	0 01 11	&	1	&	0	&	1	&	$\frac{3}{4}$	&	$\frac{7}{4}$	&	$1\times \frac{7}{4}$	&	$\frac{7}{4}$	&	1.75	\\
	\hline
	0 10 00	&	2	&	1	&	2	&	0	&	1	&	$2\times 1$	&	2	&	2	\\
	\hline
	0 10 01	&	2	&	1	&	2	&	$\frac{1}{4}$	&	$\frac{5}{4}$	&	$2\times \frac{5}{4}$	&	$\frac{5}{2}$	&	2.5	\\
	\hline
	0 10 10	&	2	&	1	&	2	&	$\frac{1}{2}$	&	$\frac{3}{2}$	&	$2\times \frac{3}{2}$	&	3	&	3	\\
	\hline
	0 10 11	&	2	&	1	&	2	&	$\frac{3}{4}$	&	$\frac{7}{4}$	&	$2\times \frac{7}{4}$	&	$\frac{7}{2}$	&	3.5	\\
	\hline
	0 11 00	&	---	&	---	&	---	&	---	&	---	&	---	&	$\infty$	&	---	\\
	\hline
	0 11 01	&	---	&	---	&	---	&	---	&	---	&	---	&	NaN	&	---	\\
	\hline
	0 11 10	&	---	&	---	&	---	&	---	&	---	&	---	&	NaN	&	---	\\
	\hline
	0 11 11	&	---	&	---	&	---	&	---	&	---	&	---	&	NaN	&	---	\\
	\hline
\end{tabular}
\end{table}	\\
\textbf{练习题2.48}	\\[2ex]
3510593整数表示:	\\
$3510593=0x00359141=0011 0101 1001 0001 0100 0001_2$	\\[2ex]
3510593浮点表示:	\\
$3510593=1.1 0101 1001 0001 0100 0001\times 2^{21}$	\\
小数部分: 1 0101 1001 0001 0100 0001 00	\\[2ex]
21+127=148,$148=1001 0100_2$	\\
阶码部分: $10010100_2$	\\[2ex]
浮点表示为: $0 10010100 1 0101 1001 0001 0100 0001 00_2=0100 1010 0101 0110 0100 0101 0000 0100_2=0x4A564504$	\\
整数表示为:\hspace{4em}001\underline{101011001000101000001}	\\
浮点数表示为:01001010010101100100010100000100	\\
关系:整数有效位除去最高有效的一位的位表示与浮点表示小数部分的有效位表示相同	\\[3ex]
\textbf{练习题2.49}	\\[2ex]
\textbf{A.} 不能准确描述的最小正整数表示为:$2^{n+1}+1$	\\
\textbf{B.} 对于单精度格式，这个整数的值为:$2^{24}+1$	\\[3ex]
\textbf{练习题2.50}	\\[2ex]
\textbf{A.} $10.010_2\ 10.0$	\\
\textbf{B.} $10.011_2\ 10.1$	\\
\textbf{C.} $10.110_2\ 11.0$	\\
\textbf{D.} $11.001_2\ 11.0$	\\[2ex]
\textbf{练习题2.51}	\\[2ex]
\textbf{A.} $x'=0.1\approx 0.00011001100110011001101_2$	\\
\textbf{B.} $x'-0.1=0.100000023841858-0.1=0.000000023841858$	\\
\textbf{C.} $\Delta t=(x'-0.1)\times 100\times 60\times 60\times 10\ s=0.0858306888\ s$	\\
\textbf{D.} $\Delta x=\Delta t \cdot 2000\ m/s=171.6613776\ m$	\\[2ex]
\textbf{练习题2.52}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|m{5em}<{\centering}|}
	\hline
	\multicolumn{2}{|c|}{格式A}	&	\multicolumn{2}{c|}{格式B}	\\
	\hline
	位	&	值	&	位	&	值	\\
	\hline
	011 0000	&	1	&	0111 000	&	1	\\
	\hline
	101 1110	&	15/2	&	1001 111	&	15/2	\\
	\hline
	010 1001	&	25/32	&	0110 100	&	3/4	\\
	\hline
	110 1111	&	31/2	&	1011 000	&	16	\\
	\hline
	000 0001	&	1/64	&	0001 000	&	1/64	\\
	\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{练习题2.53}	\\[2ex]
\#define POS\_INFINITY	1e400	\\
\#define NEG\_INFINITY	(-POS\_INFINITY)	\\
\#define NEG\_ZERO	(-1.0/POS\_INFINITY)	\\[3ex]
\textbf{练习题2.54}	\\[2ex]
\textbf{A.}	
真，因为double比int具有更大的精度和取值范围	\\
\textbf{B.}	
假，例如当x=TMAX时	\\
\textbf{C.}	
假，例如当d为最大非规格化数，即$d=0 00000000000 1111111111111111111111111111111111111111111111111111$	\\
\textbf{D.}	
真，因为double比float具有更大的精度和取值范围	\\
\textbf{E.}	
真，因为浮点数取负就是简单的对符号位取反	\\
\textbf{F.}	
真，在执行除法之前，分子和分母都会先转换成浮点数	\\
\textbf{G.}	
真，当d*d溢出为$\infty$时，仍然成立	\\
\textbf{H.}	
假，例如当f为1.0e20，d为1.0时，f+d舍入为f,f-f=0,因此表达式$(f+d)-f==d$为假	\\[2ex]
\textbf{练习题3.1}	\\
\begin{table}[htbp]
\centering
\begin{tabular}{|m{15em}<{\centering}|m{8em}<{\centering}|}
	\hline
	操作数	&	值	\\
	\hline
	\%rax	&	0x100	\\
	\hline
	0x104	&	0xAB	\\
	\hline
	\$0x108	&	0x108	\\
	\hline
	(\%rax)	&	0xFF	\\
	\hline
	4(\%rax)	&	0xAB	\\
	\hline
	9(\%rax,\%rdx)	&	0x11	\\
	\hline
	260(\%rcx,\%rdx)	&	0x13	\\
	\hline
	0xFC(,\%rcx,4)	&	0xFF	\\
	\hline
	(\%rax,\%rdx,4)	&	0x11	\\
	\hline
\end{tabular}
\end{table}	\\[2ex]
\newpage
\noindent\textbf{练习题3.2}	\\[2ex]
mov\underline{l} \%eax, (\%rsp)	\\
mov\underline{w} (\%rax), \%dx	\\
mov\underline{b} \$0xFF, \%bl	\\
mov\underline{b} (\%rsp,\%rdx,4), \%dl	\\
mov\underline{q} (\%rdx), \%rax	\\
mov\underline{w} \%dx, (\%rax)	\\[3ex]
\textbf{练习题3.3}	\\[2ex]
movb \$0xF, (\%ebx): 立即数0xF占用不够一个位，与mov类指令movb指定的位操作大小不符	\\
movl \%rax, (\%rsp): \%rax存放的是个占位4字大小的二进制数,movl指令指定的操作数的占位大小是双字，两者不符	\\
movw (\%rax), 4(\%rsp): mov类指令不能直接将位表示从内存的一个位置传到另一位置，需要借用到寄存器，通过两条指令来实现。	\\
movb \%al,\%sl: x86系列cpu中并没有名为sl的寄存器	\\
movq \%rax,\$0x123: 目的操作数不能是一个立即数	\\
movl \%eax,\%rdx: 源操作数是一个存储在寄存器中的空间大小为双字的数，目的操作数是一个能存储4字大小数的寄存器，两者不符	\\
movb \%si, 8(\%rbp): 寄存器si中存储的是一个字大小的数，movb指令指定的是对一个字节大小的数进行操作，两者不符	\\[3ex]
\textbf{练习题3.4}	\\[2ex]
\begin{table}[htbp]
\centering
\begin{tabular}{|m{8em}<{\centering}|m{8em}<{\centering}|m{12em}<{\centering}|}
	\hline
	src\_t	&	dest\_t	&	指令	\\
	\hline
	long	&	long	&	movq (\%rdi), \%rax	\\
		&		&	movq \%rax, (\%rsi)	\\
	char	&	int	&	\underline{movsbl (\%rdi), \%eax}	\\
	&	&	\underline{movl \%eax, (\%rsi)}	\\
	char	&	unsigned	&	\underline{movsbl (\%rdi), \%eax}	\\
	&	&	\underline{movl \%eax, (\%rsi)}	\\
	unsigned char	&	long	&	\underline{movzbq (\%rdi), \%rax}	\\
	&	&	\underline{movq \%rax, (\%rsi)}	\\
	int	&	char	&	\underline{movl (\%rdi), \%eax}	\\
	&	&	\underline{movb \%al, (\%rsi)}	\\
	unsigned	&	unsigned char	&	\underline{movl (\%rdi), \%eax}	\\
	&	&	\underline{movb \%al, (\%rsi)}	\\
	char	&	short	&	\underline{movsbw (\%rdi), \%ax}	\\
	&	&	\underline{movw \%ax, (\%rsi)}	\\
	\hline
\end{tabular}
\end{table}	\\[2ex]
\newpage
\noindent\textbf{练习题3.5}	\\[2ex]
void decode1(long *xp, long *yp, long *zp)	\\
\{	\\
	\hspace*{4em}	long x, y, z;	\\
	\hspace*{4em}	x = *xp;	\\
	\hspace*{4em}	y = *yp;	\\
	\hspace*{4em}	z = *zp;	\\
	\hspace*{4em}	*yp = x;	\\
	\hspace*{4em}	*zp = y;	\\
	\hspace*{4em}	*zp = z;	\\
	\hspace*{4em}	return z;	\\
\}	\\[3ex]
\textbf{练习题3.6}	\\
\begin{table}[htbp]
\centering
\begin{tabular}{|m{18em}<{\centering}|m{10em}<{\centering}|}
	\hline
	表达式	&	结果	\\
	\hline
	leaq 6(\%ax),\%rdx	&	$x\%2^4+6$	\\
	\hline
	leaq (\%rax,\%rcx),\%rdx	&	x+y	\\
	\hline
	leaq (\%rax,\%rcx,4),\%rdx	&	x+y*4	\\
	\hline
	leaq 7(\%rax,\%rax,8),\%rdx	&	9*x+7	\\
	\hline
	leaq 0xA(,\%rcx,4),\%rdx	&	4*y+0xA	\\
	\hline
	leaq 9(\%rax,\%rcx,2),\%rdx	&	x+2*y+9	\\
	\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{练习题3.7}	\\[2ex]
long scale2(long x,long y,long z)	\\
\{	\\
	long t = \underline{5x+2y+8z};	\\
	return t;	\\
\}	\\[3ex]
\textbf{练习题3.8}	\\[2ex]
\begin{table}[htbp]
\centering
\begin{tabular}{|m{18em}<{\centering}|m{10em}<{\centering}|m{10em}<{\centering}|}
	\hline
	指令	&	目的	&	值	\\
	\hline
	addq \%rcx,(\%rax)	&	0x100	&	0x100	\\
	\hline
	subq \%rdx,8(\%rax)	&	0x108	&	0xA8	\\
	\hline
	imulq \$16,(\%rax,\%rdx,8)	&	0x118	&	0x110	\\
	\hline
	incq 16(\%rax)	&	0x110	&	0x111	\\
	\hline
	decq \%rcx	&	rcx	&	0	\\
	\hline
	subq \%rdx,\%rax	&	rax	&	0xFD	\\
	\hline
\end{tabular}
\end{table}	\\[2ex]
\newpage
\noindent\textbf{练习题3.9}	\\[2ex]
shift\_left4\_rightn:	\\
\hspace*{1em} movq \%rdi, \%rax	\\
\hspace*{1em} shl \$4, \%rax	\\
\hspace*{1em} movl \%esi, \%ecx	\\
\hspace*{1em} sarq \%cl, \%rax	\\[3ex]
\textbf{练习题3.0}	\\[2ex]
long arith2(long x,long y,long z)	\\
\{	\\
\hspace*{2em}	long t1 = \underline{$x | y$};	\\
\hspace*{2em}	long t2 = \underline{$t1 >> 3$};	\\
\hspace*{2em}	long t3 = \underline{$\sim{t2}$};	\\
\hspace*{2em}	long t4 = \underline{z - t3};	\\
\hspace*{2em}	return t4;	\\
\}	\\[3ex]
\textbf{练习题3.11}	\\[2ex]
\textbf{A.} 将寄存器rdx所有位置0	\\
\textbf{B.} movq \$0, \%rdx	\\
\textbf{C.} 实现一个置0运算，用xor \%edx,\%edx 编码需2个字节;用mov \$0,\%rdx编码需5个字节。	\\[3ex]
\textbf{练习题3.12}	\\[2ex]
\blue{void uremdiv(long x, long y, long *qp, long *rp)}	\\
\blue{x in \%rdi, y in \%rsi, qp in \%rdx, rp in \%rcx}	\\
remdiv:	\\
\hspace*{2em}	movq	\%rdx, \%r8	\hspace*{2em}\blue{Copy qp}	\\
\hspace*{2em}	movq	\%rdi, \%rax	\hspace*{1.7em}\blue{Move x to lower 8 bytes of dividend}	\\
\hspace*{2em}	xorq	\%rdx, \%rdx	\hspace*{1.8em}\blue{Sign-extend to upper 8 bytes of dividend}	\\
\hspace*{2em}	divq	\%rsi		\hspace*{5.2em}\blue{Divide by y}	\\
\hspace*{2em}	movq 	\%rax, (\%r8)	\hspace*{1.3em}\blue{Store quotient at qp}	\\
\hspace*{2em}	movq	\%rdx, (\%rcx)	\hspace*{0.8em}\blue{Store remainder at rp}	\\
\hspace*{2em}	ret	\\[3ex]
\textbf{练习题 3.13}	\\[2ex]
\textbf{A.} data\_t是 int 数据类型,COMP是$<$	\\
\textbf{B.} data\_t是 short 数据类型,COMP是$>=$	\\
\textbf{C.} data\_t是 unsigned char 数据类型,COMP是$<=$	\\
\textbf{D.} data\_t是 long or unsigned long 数据类型，COMP是$!=$	\\[3ex]
\textbf{练习题3.14}	\\[2ex]
\textbf{A.} date\_t是 long 数据类型，COMP是$>=$	\\
\textbf{B.} date\_t是 short or unsigned short 据类型，COMP是$==$	\\
\textbf{C.} date\_t是 unsigned char 数据类型，COMP是$>$	\\
\textbf{D.} date\_t是 int or unsigned int 数据类型，COMP是$!=$	\\[3ex]
\textbf{练习题3.15}	\\[2ex]
% 表格行距设置
\renewcommand\arraystretch{1}
\textbf{A.}	\\[-3ex]
\begin{table}[htbp]
\begin{tabular}{m{10em}m{10em}}
4003fa: 74 02	&	je \blue{4003fe}	\\
4003fc: ff d0	&	callq *\%rax	\\
\end{tabular}
\end{table}	\\
\newpage
\noindent\textbf{B.} 	\\[-3ex]
\begin{table}[htbp]
\begin{tabular}{m{10em}m{10em}}
40042f: 74 f4	&	je \blue{400425}	\\
400431: 5d	&	pop \%rbp	\\
\end{tabular}
\end{table}	\\
\textbf{C.} 	\\[-3ex]
\begin{table}[htbp]
\begin{tabular}{m{10em}m{10em}}
\blue{400423}: 77 02	&	ja 400547	\\
\blue{400425}: 5d	&	pop \%rbp	\\
\end{tabular}
\end{table}	\\
\textbf{D.} 	\\[-3ex]
\begin{table}[htbp]
\begin{tabular}{m{10em}m{10em}}
4005e8: e9 73 ff ff ff	&	jmpq \blue{400560}	\\
4005ed: 90	&	nop 	\\
\end{tabular}
\end{table}	\\
\textbf{练习题3.16}	\\[2ex]
\textbf{A.}	\\
void cond(long a, long *p)				\\
\{							\\
	\hspace*{2em}	if(p==0)			\\
	\hspace*{4em}		goto p\_not\_ez;	\\
	\hspace*{2em}	if(a $<=$ *p)			\\
	\hspace*{4em}		goto p\_not\_ez;	\\
	\hspace*{2em}	*p=a;				\\
	\hspace*{2em}	p\_not\_ez:			\\
\}							\\[2ex]
\textbf{B.}	\\
C语言代码中的if条件，包含两个判断，只有当p为1,且a$>$*p这两个条件都成立时，才会执行给定的语句。对于给定的两个条件，c能用一个表达式来实现，但汇编却一次只能实现一个判断，因此需要两个条件分支来实现两个判断。	\\[3ex]
\textbf{练习题3.17}	\\[2ex]
\textbf{A.}	\\
long gotodiff\_se(long x, long y)	\\
\{	\\
	\hspace*{2em}	long result;		\\
	\hspace*{2em}	if (x $<$ y)		\\
	\hspace*{4em}		goto x\_l\_y;	\\
	\hspace*{2em}	ge\_cnt++;		\\
	\hspace*{2em}	result = x - y;		\\
	\hspace*{2em}	return result;		\\
	\hspace*{1em} x\_l\_y:			\\
	\hspace*{2em}	lt\_cnt++;		\\
	\hspace*{2em}	result = y - x;		\\
	\hspace*{2em}	return result;		\\
\}	\\[1ex]
\textbf{B.}	\\
( 原先答案: jmp类指令不同的指令所需执行的操作数是不同的，选用jmp最少操作数的规则即可。 )	\\
在大多数情况下，可以在这两种方式中任意选择。但是原来的方法对常见的没有else语句的情况更好一些。对于这种情况，我们只用简单地将翻译规则修改如下:	\\
	\hspace*{2em}	t = test-expr;		\\
	\hspace*{2em}	if (!t)			\\
	\hspace*{4em}		goto done;	\\
	\hspace*{2em}	then-statement		\\
	\hspace*{1em} done:			\\
	基于这种替代规则的翻译更麻烦一些。		\\[3ex]
\textbf{练习题3.18}	\\
long test(long x, long y, long z)	\\
\{					\\
	\hspace*{2em}	long val = \underline{ x+y+z };	\\
	\hspace*{2em}	if (\underline{ -3$<$ x })		\\
	\hspace*{2em}	\{	\\
	\hspace*{4em}		if (\underline{ z$>=$y })	\\
	\hspace*{6em}			val = \underline{y*z};	\\
	\hspace*{4em}		else	\\
	\hspace*{6em}			val = \underline{x*y};	\\
	\hspace*{2em}	\}	\\
	\hspace*{2em}	else if (\underline{2$>$x})			\\
	\hspace*{4em}		val = \underline{x*z};		\\
	\hspace*{2em}	return val;						\\
\}					\\[3ex]
\textbf{练习题3.19}	\\[1ex]
\textbf{A.} 由题可知，$T_{OK}=16$, $T_{ran}=31$, 因此$T_{MP}=2(T_{ran}-T_{OK})=30$, 即预测错误处罚大约30个时钟周期。	\\[1ex]
\textbf{B.} $T_{wrong}=T_{OK}+T_{MP}=16+30=46$, 即当分支预测错误时，这个函数需要46个时钟周期。	\\[3ex]
\textbf{练习题3.20}	\\[1ex]
\textbf{A.} /。OP进行的是除法操作。	\\[1ex]
\textbf{B.} 	\\
\hspace*{2em}	\blue{long arith(long x)}	\\
\hspace*{2em}	\blue{x in \%rdi}		\\
	       arith:						\\
		\hspace*{2em}	leaq	7(\%rdi), \%rax		\hspace*{2em}	\blue{\%rax=7+x}	\\
		\hspace*{2em}	testq	\%rdi, \%rdi		\hspace*{2em}	\blue{\%rdi \& \%rdi}	\\
		\hspace*{2em}	cmovns	\%rdi, \%rax		\hspace*{2em}	\blue{\%rdi(x)是否为负。非负 \%rax=x; 负 \%rax=7+x}	\\
		\hspace*{2em}	sarq	\$3, \%rax		\hspace*{2em}	\blue{$\%rax=\%rax/2^3$}	\\
		\hspace*{2em}	ret				\\[3ex]
\textbf{练习题3.21}	\\[1ex]
long test(long x, long y)	\\
\{	\\
	\hspace*{2em}	long val = \underline{8*x};			\\
	\hspace*{2em}	if (\underline{y $>$ 0})				\\
	\hspace*{2em}	\{	\\
	\hspace*{4em}		if (\underline{x $>=$ y})			\\
	\hspace*{6em}			val = \underline{x \& y};	\\
	\hspace*{4em}		else						\\
	\hspace*{6em}			val = \underline{y - x};	\\
	\hspace*{2em}	\}	\\
	\hspace*{2em}	else if (\underline{y $<=$ -2})			\\
	\hspace*{4em}		val = \underline{x + y};		\\
	\hspace*{2em}	return val;	\\
\}	\\[3ex]
\textbf{练习题3.22}	\\[1ex]
\textbf{A. }当n!用一个32位int表示时，最大的n的值是12	\\
\textbf{B. }当n!用一个64位long表示时，最大的n的值是20	\\[3ex]
\newpage
\noindent\textbf{练习题3.23}	\\[1ex]
\textbf{A. }\%rax存放x,\%rcx存放y,\%rdx存放n	\\
\textbf{B. }用寄存器解决了对指针变量和指针间接引用的需求	\\
\red{编译器认为指针 p 总是指向 x \textbf{( :D c 中其它用到指针的地方编译器是否也是以这种方式实现的，即直接造出一个变量存储在内存中地址为a的位置处 :D)} ，因此表达式 (*p)++ 就能实现 x 加一。代码通过第 7 行的 leaq 指令，把这个加一和加 y 组合起来。}	\\
\textbf{C. }对汇编代码添加注释后如下所示:	\\[-4ex]
\begin{table}[htbp]
\begin{tabular}{m{1em}m{3em}m{12em}l}
		&	\multicolumn{2}{l}{\blue{long dw\_loop(long x)}}	&	\\
		&	\multicolumn{2}{l}{\blue{x initially in \%rdi}}	&	\\
	dw\_loop:	\\
	&	movq	&	\%rdi, \%rax	&	\blue{\%rax = x}	\\
	&	movq	&	\%rdi, \%rcx	&	\blue{\%rcx = x}	\\
	&	imulq	&	\%rdi, \%rcx	&	\blue{\%rcx = x*x}	\\
	&	leaq	&	(\%rdi, \%rdi), \%rdx	&	\blue{\%rdx = 2*x}	\\
	.L2:	&	&			&	\blue{loop:}	\\
	&	leaq	&	1(\%rcx, \%rax), \%rax	&	\blue{\%rax = 1 + $x^2$ + x}	\\
	&	subq	&	\$1, \%rdx		&	\blue{\%rdx = 2*x - 1}	\\
	&	testq	&	\%rdx, \%rdx		&	\blue{( 2*x-1 ) \& ( 2*x-1 )}	\\
	&	jg	&	.L2			&	\blue{( 2*x-1 )$>$0, goto .L2; ( 2*x-1 )$<=0$; return \%rax }	\\
	&	rep;	&	ret			&	\blue{}	\\
\end{tabular}
\end{table}	\\
\textbf{练习题3.24}	\\[-3ex]
\begin{table}[ht]
\begin{tabular}{m{2em}m{2em}m{2em}l}
	\multicolumn{3}{l}{long loop\_while(long a, long b)}	\\
\{	\\
&	\multicolumn{3}{l}{ long result = \underline{\blue{ 1 }}; }	\\
&	\multicolumn{3}{l}{ while (\underline{\blue{$a<b$}}) \{ } 	\\
&	&	\multicolumn{2}{l}{result = \underline{\blue{result*(a+b)}};}	\\
&	&	\multicolumn{2}{l}{a = \underline{\blue{a+1}};}	\\
&	\multicolumn{3}{l}{\}}	\\
&	\multicolumn{3}{l}{return result;}	\\
\}	\\
\end{tabular}
\end{table}	\\
\textbf{练习题3.25}	\\[-3ex]
\begin{table}[ht]
\begin{tabular}{m{2em}m{2em}m{2em}l}
	\multicolumn{3}{l}{long loop\_while2(long a, long b)}	\\
\{	\\
	&	\multicolumn{3}{l}{ long result = \underline{\blue{b}}; }	\\
	&	\multicolumn{3}{l}{ while (\underline{\blue{ $b>0$ }}) \{ } 	\\
	&	&	\multicolumn{2}{l}{result = \underline{\blue{result * a}};}	\\
	&	&	\multicolumn{2}{l}{b = \underline{\blue{b - a}};}	\\
&	\multicolumn{3}{l}{\}}	\\
&	\multicolumn{3}{l}{return result;}	\\
\}	\\
\end{tabular}
\end{table}	\\
\textbf{练习题3.26}	\\[1ex]
\textbf{A. }这段代码使用了jump to middle的循环翻译方法	\\
\newpage
\noindent\textbf{B. }	\\[-3ex]
\begin{table}[htbp]
\begin{tabular}{m{2em}m{2em}m{2em}l}
	\multicolumn{3}{l}{long fun\_a(unsigned long x)}	\\
\{	\\
	&	\multicolumn{3}{l}{long val = 0;}	\\
	&	\multicolumn{3}{l}{ while (x != 0) \{ } 	\\
	&	&	\multicolumn{2}{l}{val = val \^{} x;}	\\
	&	&	\multicolumn{2}{l}{x = x $>>$ 1;}	\\
	&	\multicolumn{3}{l}{ \} } 	\\
	&	\multicolumn{3}{l}{val = val \& 1;} 	\\
	&	\multicolumn{3}{l}{return val;} 	\\
\}	\\
\end{tabular}
\end{table}	\\
\textbf{C. }该函数统计参数x的二进制位表示中1的个数，若位表示中有奇数个1，则返回1；有偶数个1，则返回0。	\\[2ex]
\textbf{练习题3.27}	\\[-3ex]
\begin{table}[ht]
\begin{tabular}{m{2em}m{2em}m{2em}l}
	\multicolumn{3}{l}{long fact\_for\_guarded\_do(long n)}	\\
\{	\\
	&	\multicolumn{3}{l}{long i = 2;}	\\
	&	\multicolumn{3}{l}{long result = 1;}	\\
	&	\multicolumn{3}{l}{ if (i $>$ n)  } 	\\
	&	&	\multicolumn{2}{l}{goto done;} 	\\
	\multicolumn{3}{l}{loop:} 	\\
	&	&	\multicolumn{2}{l}{result *= i;}	\\
	&	&	\multicolumn{2}{l}{i++;}	\\
	&	\multicolumn{3}{l}{if (i $<=$ n)}	\\
	&	&	\multicolumn{2}{l}{goto loop;} 	\\
	\multicolumn{3}{l}{done:} 	\\
	&	\multicolumn{3}{l}{return result;} 	\\
\}	\\
\end{tabular}
\end{table}	\\
\textbf{练习题3.28}	\\[2ex]
\textbf{A. }	补全后代码如下:\\[-4ex]
\begin{table}[ht]
\begin{tabular}{m{2em}m{2em}m{2em}l}
	\multicolumn{3}{l}{long fun\_b(unsigned long x)}	\\
\{	\\
	&	\multicolumn{3}{l}{long val = 0;}	\\
	&	\multicolumn{3}{l}{long i;}	\\
	&	\multicolumn{3}{l}{for (\blue{i=64;i!=0;i-\hspace{0.1em}-})} 	\\
	&	\multicolumn{3}{l}{\{} 	\\
	&	&	\multicolumn{2}{l}{\blue{$val=(x\&1)|(2*val)$;}} 	\\
	&	&	\multicolumn{2}{l}{\blue{$x=x>>1$;}} 	\\
	&	\multicolumn{3}{l}{\}} 	\\
	&	\multicolumn{3}{l}{return val;} 	\\
	\multicolumn{3}{l}{\}}	\\
\end{tabular}
\end{table}	\\
\textbf{B. }	\\
此段代码是用guarded-do翻译方法翻译的，因此原本应有初始测试，测试i!=0,但由于i被初始赋值为64,肯定不为零，因此编译器在优化编译时将此初始测试省略。	\\[1ex]
\textbf{C. }	\\
此函数将参数x的二进制位表示逆向排序后得出的十进制数返回。	\\[2ex]
\newpage
\noindent\textbf{练习题3.29}	\\[1ex]
\textbf{A. }直接应用将for循环翻译到while循环的规则，得到如下代码：	\\[-4ex]
\begin{table}[ht]
\begin{tabular}{m{2em}m{2em}m{2em}l}
	\multicolumn{3}{l}{long sum = 0;}	\\
	\multicolumn{3}{l}{long i;}	\\
	\multicolumn{3}{l}{i = 0;}	\\
	\multicolumn{3}{l}{while(i $<$ 10)}	\\
	\multicolumn{3}{l}{\{}	\\
	&	\multicolumn{2}{l}{if(i \& 1)}	\\
	&	&	continue;	\\
	&	\multicolumn{2}{l}{sum += 1;}	\\
	&	\multicolumn{2}{l}{i++;}	\\
	\multicolumn{3}{l}{\}}	\\
\end{tabular}
\end{table}	\\[-2ex]
可以看到所产生的代码当执行到continue时，会跳过i自增的操作，因此此段代码循环部分永远不会结束，程序会陷入一个死循环中，与for循环产生了完全不同的运行行为，可见直接应用将for循环翻译到while循环的规则来翻译这段代码是不可行的。	\\[1ex]
\textbf{B. }	\\[1ex]
用goto语句代替continue语句，可以以此来保证翻译的准确性,以此原理翻译上述代码得到如下结果:	\\[-4ex]
\begin{table}[ht]
\begin{tabular}{m{2em}m{2em}m{2em}l}
	\multicolumn{3}{l}{long sum = 0;}	\\
	\multicolumn{3}{l}{long i;}	\\
	\multicolumn{3}{l}{i = 0;}	\\
	\multicolumn{3}{l}{while(i $<$ 10)}	\\
	\multicolumn{3}{l}{\{}	\\
	&	\multicolumn{2}{l}{if(i \& 1)}	\\
	&	&	\multicolumn{2}{l}{ goto loop\_end; }	\\
	&	\multicolumn{2}{l}{sum += 1;}	\\
	\multicolumn{3}{l}{\hspace{1.5em}loop\_end:}	\\
	&	\multicolumn{2}{l}{i++;}	\\
	\multicolumn{3}{l}{\}}	\\
\end{tabular}
\end{table}	\\[-1ex]
\textbf{练习题3.30}	\\
\textbf{A. }	\\
switch语句内情况标号的值分别为0,1,2,3,4,5,6,7,8	\\
\textbf{B. }	\\
在c代码中多个标号是同种情况有以下情形:	\\
1)default,除给定的情况外，其它所有值都归为此类情况	\\
2)给定值后，没有操作，也没有break，会继续执行后面的case情形，此情形就与后面case情形成为了一种情况	\\[2ex]
\newpage
\noindent\textbf{练习题3.31}	\\[-4ex]
\begin{table}[ht]
\begin{tabular}{m{2em}m{2em}m{8em}l}
	\multicolumn{3}{l}{void switcher(long a, long b, long c, long *dest)}	\\
	\multicolumn{3}{l}{\{}	\\
	&	\multicolumn{2}{l}{long val;}	\\
	&	\multicolumn{2}{l}{switch(a) \{}	\\
	&	\multicolumn{2}{l}{case \underline{ 5 }:}	&	\blue{/* Case A */}	\\
	&	&	c = \underline{b\^{}15};	&	\blue{/* Fall through */}	\\
	&	\multicolumn{2}{l}{case \underline{ 0 }:}	&	\blue{/* Case B */}	\\
	&	&	val = \underline{ 112 + c };	\\
	&	&	break;	\\
	&	\multicolumn{2}{l}{case \underline{ 2 }:}	&	\blue{/* Case C */}	\\
	&	\multicolumn{2}{l}{case \underline{ 7 }:}	&	\blue{/* Case D */}	\\
	&	&	val = \underline{ 4( b+c ) };	\\
	&	&	break;	\\
	&	\multicolumn{2}{l}{case \underline{ 4 }:}	&	\blue{/* Case E */}	\\
	&	&	val = \underline{ a };	\\
	&	&	break;	\\
	&	\multicolumn{2}{l}{default:}	\\
	&	&	val = \underline{ b };	\\
	&	\multicolumn{2}{l}{\}}	\\
	&	\multicolumn{2}{l}{*dest = val;}	\\
	\multicolumn{3}{l}{\}}	\\
\end{tabular}
\end{table}	\\[-1ex]
\textbf{练习题3.32}	\\[-4ex]
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{3em}<{\centering}|m{8em}<{\centering}|m{3em}<{\centering}|m{4em}<{\centering}|m{4em}<{\centering}|m{4em}<{\centering}|m{8em}<{\centering}|m{4em}<{\centering}|m{8em}<{\centering}|}
\hline
\multicolumn{3}{|c}{指令}	&	\multicolumn{6}{|c|}{状态值(指令执行前)}	\\
\hline
标号	&	PC	&	指令	&	\%rdi	&	\%rsi	&	\%rax	&	\%rsp	&	* \%rsp	&	描述	\\
\hline
M1	&	0x400560	&	callq	&	10	&	---	&	---	&	0x7fffffffe820	&	---	&	调用 first(10)	\\
\hline
F1	&	0x400548	&	lea	&	10	&	---	&	---	&	0x7fffffffe818	&	0x400565	&	进入first	\\
\hline
F2	&	0x40054c	&	sub	&	10	&	11	&	---	&	0x7fffffffe818	&	0x400565	&	执行first	\\
\hline
F3	&	0x400550	&	callq	&	9	&	11	&	---	&	0x7fffffffe818	&	0x400565	&	调用last(10,11)	\\
\hline
L1	&	0x400540	&	mov	&	9	&	11	&	---	&	0x7fffffffe810	&	0x400555	&	进入last	\\
\hline
L2	&	0x400543	&	imul	&	9	&	11	&	9	&	0x7fffffffe810	&	0x400555	&	执行last	\\
\hline
L3	&	0x400547	&	retq	&	9	&	11	&	99	&	0x7fffffffe810	&	0x400555	&	从last返回110	\\
\hline
F4	&	0x400555	&	repz repq	&	9	&	11	&	99	&	0x7fffffffe818	&	0x400565	&	从first返回110	\\
\hline
M2	&	0x400565	&	mov	&	9	&	11	&	99	&	0x7fffffffe820	&	---	&	继续main	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{练习题3.33}	\\
\textbf{1)} 4个参数合法顺序:a,b,u,v	\\
int a	\\
long *u	\\
short b	\\
char *v	\\
procprob(int a,short b,long *u,char *v)	\\
\textbf{2)} 当汇编代码按相反顺序执行两个加法运算时，此汇编代码同样合法，此时a和b，u和v会调换位置，得到如下函数原型
procprob(int b,short a,long *v,char *u)	\\[3ex]
\textbf{练习题3.34}	\\
\textbf{A.}	\\
x,x+1,x+2,x+3,x+4,x+5存储在被调用者保存寄存器中	\\
\textbf{B.}	\\
x+6,x+7存储在栈上	\\
\textbf{C.}	\\
在存储完$a_0$到$a_5$到被调用者保存寄存器中后，这个程序用完了所有被调用者保存寄存器，只能将$a_6$,$a_7$存储到栈中	\\[3ex]
\textbf{练习题3.35}	\\
\textbf{A.} \%rbx中的值是参数x	\\
\textbf{B.}	\\
long rfun(unsigned long x) \{	\\
	\hspace*{2em}if (\underline{\blue{x == 0}})	\\
	\hspace*{4em}return {\underline{\blue{0}}};	\\
		\hspace*{2em}unsinged long nx = \underline{\blue{ x / 4 }};	\\
		\hspace*{2em}long rv = rfun(nx);	\\
		\hspace*{2em}return \underline{\blue{ rv + x }};	\\
\noindent\}	\\[2em]
\textbf{练习题3.36}	\\
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{6em}<{\centering}|m{6em}<{\centering}|m{12em}<{\centering}|m{6em}<{\centering}|m{12em}<{\centering}|}
\hline
数组	&	元素大小	&	整个数组的大小	&	起始地址	&	元素i	\\
\hline
S	&	2		&	14		&	$x_S$		&	$x_S+2i$	\\
\hline
T	&	8		&	24		&	$x_T$		&	$x_T+8i$	\\
\hline
U	&	8		&	48		&	$x_U$		&	$x_U+8i$	\\
\hline
V	&	4		&	32		&	$x_V$		&	$x_V+4i$	\\
\hline
W	&	8		&	32		&	$x_W$		&	$x_W+8i$	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{练习题3.37}	\\
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{12em}<{\centering}|m{12em}<{\centering}|m{12em}<{\centering}|m{14em}<{\centering}|}
\hline
表达式		&	类型	&	值		&	汇编代码	\\
\hline
S + 1		&	short*	&	$x_S+2$		&	leaq (\%rdx,\%rcx,2),\%rax	\\
\hline
S[3]		&	short	&	$M[x_S+6]$	&	movw (\%rdx,\%rcx,2),\%ax	\\
\hline
\&S[i]		&	short*	&	$x_S+2i$	&	leaq (\%rdx,\%rcx,2),\%rax	\\
\hline
S[4*i + 1]	&	short	&	$M[x_S+8i+2]$	&	movw 2(\%rdx,\%rcx,8),\%rax	\\
\hline
S + i - 5	&	short*	&	$x_S+2i-10$	&	leaq -10(\%rdx,\%rcx,2),\%rax	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{练习题3.38}	\\
8M=40,M=5	\\
8N=56,N=7	\\[2em]
\textbf{练习题3.39}	\\[2ex]
由 c 代码可知	\\
$Aptr=x_A+4(16i)=x_A+64i$	\\
$Bptr=x_B+4k$	\\
$Bend=x_B+4(16*16+k)=x_B+4k+1024$	\\[2ex]
\newpage
\noindent\textbf{练习题3.40}	\\
void fix\_set\_diag(fix\_matrix A, int val) \{	\\
	\hspace*{2em}long x = 0;	\\
	\hspace*{2em}int *Aptr=\&A[0][0];	\\
	\hspace*{2em}int *Eptr=\&A[N][N];	\\
	\hspace*{2em}do \{	\\
		\hspace*{4em}*Aptr=val;	\\
		\hspace*{4em}Aptr=Aptr+N+1;	\\
	\hspace*{2em}\} while(Aptr != Eptr);	\\
\}	\\[3ex]
\textbf{练习题3.41}	\\[1ex]
\textbf{A.}	\\
p:\underline{0}	\\
s.x:\underline{8}	\\
s.y:\underline{12}	\\
next:\underline{16}	\\[1ex]
\textbf{B.} 这个结构总共需要24个字节	\\[1ex]
\textbf{C.}  	\\
void sp\_init(struct prob *sp) \{	\\
	\hspace*{2em}sp$->$s.x = \underline{sp$->$s.y};	\\
	\hspace*{2em}sp$->$p = \underline{\&sp$->$s.x};	\\
	\hspace*{2em}sp$->$next = \underline{sp};	\\
\}	\\[3ex]
\textbf{练习题3.42}	\\
\textbf{A.} 	\\
long fun(struct ELE *ptr) \{	\\
	\hspace*{2em}long x=0;	\\
	\hspace*{2em}while(ptr != 0)	\\
	\hspace*{2em}\{	\\
		\hspace*{4em}x += ptr$->$v;	\\
		\hspace*{4em}ptr = ptr$->$p;	\\
	\hspace*{2em}\}	\\
	\hspace*{2em}return x;	\\
\}	\\[2ex]
\textbf{B.}	\\
此结构实现了单向链表的数据结构	\\
fun将此单向链表中的所有数据元素求和并返回	\\[3ex]
\newpage
\textbf{练习题3.43}	\\
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{12em}<{\centering}|m{8em}<{\centering}|m{18em}<{\centering}|}
\hline
expr		&	type	&	代码	\\
\hline
up$->$t1.u	&	long	&	movq (\%rdi),\%rax	\\
		&		&	movq \%rax,(\%rsi)	\\
\hline
up$->$t1.v	&	\blue{short}	&	\blue{movw (\%rdi,8,),\%ax}	\\
		&			&	\blue{movw \%ax,(\%rsi)}	\\
\hline
\&up$->$t1.w	&	\blue{char *}	&	\blue{leaq (\%rdi,10,),\%rax}	\\
		&			&	\blue{movq \%rax,\%rsi}		\\
\hline
up$->$t2.a	&	\blue{int *}	&	\blue{movq \%rdi,\%rsi}		\\
\hline
up$->$t2.a[up$->$t1.u]	&	\blue{int}	&	\blue{movl (\%rdi),\%rax}	\\
			&			&	\blue{movl (\%rdi,\%rax,4),\%eax}	\\
			&			&	\blue{movl \%eax,( \%rsi )}	\\
\hline
*up$->$t2.p		&	\blue{char}	&	\blue{movb (\%rdi,8,),\%al}	\\
			&			&	\blue{movb \%al,( \%rsi )}			\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{练习题3.44}	\\[2ex]
\textbf{A.}	\\[1ex]
i	0	\\
c	4	\\
j	8	\\
d	12	\\
总大小	16	\\
对齐要求:4的倍数	\\[1ex]
\textbf{B.}	\\[1ex]
i	0	\\
c	4	\\
d	5	\\
j	8	\\
总大小	16	\\
对齐要求:8的倍数	\\[1ex]
\textbf{C.}	\\[1ex]
w	0	\\
c	6	\\
总大小	10	\\
对齐要求:2的倍数	\\[1ex]
\textbf{D.}	\\[1ex]
w	0	\\
c	16	\\
总大小	40	\\
对齐要求:8的倍数	\\[1ex]
\textbf{E.}	\\[1ex]
a	0	\\
t	24	\\
总大小	40	\\
对齐要求:8的倍数	\\[2ex]
\textbf{3.45}	\\
\textbf{A.}	\\[-3ex]
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|}
\hline
a	&	b	&	c	&	d	&	e	&	f	&	g	&	h	\\
\hline
0	&	8	&	16	&	24	&	28	&	32	&	40	&	48	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{B.} 56	\\[1ex]
\textbf{C.}	\\
struct \{	\\
	\hspace*{2em}char *a;	\\
	\hspace*{2em}double c;	\\
	\hspace*{2em}long g;	\\
	\hspace*{2em}float e;	\\
	\hspace*{2em}int h;	\\
	\hspace*{2em}short b;	\\
	\hspace*{2em}char d;	\\
	\hspace*{2em}char f;	\\
\} rec;	\\[4ex]
重排过的结构的字节偏移量:	\\[-3ex]
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|m{6em}<{\centering}|}
\hline
a	&	c	&	g	&	e	&	h	&	b	&	d	&	f	\\
\hline
0	&	8	&	16	&	24	&	28	&	32	&	34	&	35	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
重排过的结构的总大小:40	\\[3ex]
\textbf{练习题3.46}	\\
\textbf{A.}	\\[-2ex]
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}|m{16em}<{\centering}|}
\hline
00	&	00	&	00	&	00	&	00	&	40	&	00	&	76	&	返回地址	\\
\hline
\blue{01}	&	\blue{23}	&	\blue{45}	&	\blue{ 67 }	&	\blue{ 89 }	&	\blue{ AB }	&	\blue{ CD }	&	\blue{ EF }	&	\blue{\%rbx的值}	\\
\hline
	&		&		&		&		&		&		&		&	\\
\hline
	&		&		&		&		&		&		&		&
	\blue{  \%rsp 指向的内存位置 }	\\
\hline
	&		&		&		&		&		&		&		&	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\newpage
\noindent\textbf{B.}	\\[-2ex]
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}|m{16em}<{\centering}|}
\hline
00	&	00	&	00	&	00	&	00	&	40	&	00	&	\blue{34}	&	返回地址	\\
\hline
\blue{33}	&	\blue{32}	&	\blue{31}	&	\blue{30}	&	\blue{39}	&	\blue{38}	&	\blue{37}	&	\blue{36}	&	\\
\hline
\blue{35}	&	\blue{34}	&	\blue{33}	&	\blue{32}	&	\blue{31}	&	\blue{30}	&	\blue{39}	&	\blue{38}	&	\\
\hline
\blue{37}	&	\blue{36}	&	\blue{35}	&	\blue{34}	&	\blue{33}	&	\blue{32}	&	\blue{31}	&	\blue{30}	&	\\
\hline
\blue{00}	&	\blue{ 00 }	&	\blue{ 00 }	&	\blue{ 00 }	&	\blue{ 00 }	&	\blue{40}	&	\blue{07}	&	\blue{33}	&		\\
\hline
\end{tabular}
\end{table}	\\
\textbf{C.}	\\
程序应该试图返回到地址0x400034	\\[2ex]
\textbf{D.}	\\
当get\_line返回时，寄存器\%rbx,\%rcp的值被破坏了	\\[2ex]
\textbf{E.}	\\
\textbf{1)} malloc参数错误，buf是一个指向char型的指针,因此对于32位机器malloc会分配4个字节，对于64位机器，malloc会分配8个字节,这造成了内存空间的浪费	\\
\textbf{2)} malloc分配内存空间后，需要手动调用free函数来释放空间，否则会造成内存泄漏，浪费内存空间.	\\
\red{对malloc函数的调用，其参数应该为strlen(buf)+1,而且还应该检查其返回值是否为NULL}	\\[2ex]
\textbf{练习题3.47}	\\
\textbf{A.} 地址的大概范围是2\^{}13	\\
\textbf{B.} 2\^{}13/128=2\^{}13/2\^{}7=2\^{}6=64	\\
要想穷尽所有起始地址，需要64次.	\\[2ex]
\textbf{练习题3.48}	\\
\textbf{A.}	\\
\textbf{a.}	\\[-2ex]
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}|m{16em}<{\centering}|}
\hline
	&	&	&	&	&	&	&		&	返回地址	\\
\hline
	\\
\hline
&	&	&	&	&	&	&		&	x的值 \red{v的位置}	\\
\hline
	\\
\hline
	\\
\hline
&	&	&	&	&	&	&		&	\%rsp的位置 \red{buf的位置}	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{b.}	\\
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}m{2em}<{\centering}|m{16em}<{\centering}|}
\hline
	&	&	&	&	&	&	&		&	返回地址	\\
\hline
	\\
\hline
	&	&	&	&	&	&	&		&	金丝雀值(guard value)	\\
\hline
	\\
\hline
	\\
\hline
	&	&	&	&	&	&	&		&	\red{buf的位置}	\\
\hline
	&	&	&	&	&	&	&		&	x的值 \red{v的位置}	\\
\hline
	&	&	&	&	&	&	&		&	\%rsp的位置	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\newpage
\noindent\textbf{B.}	\\
在有保护的代码中，v比buf更靠近栈顶，因此buf溢出不会破坏v的值	\\[2ex]
\textbf{练习题3.49}	\\[1ex]
\textbf{A.}	\\
$s_1=\%rsp-16$	\\
\%rax=8n+22	\\
\%rax=\%rax-\%rax mod 16	\\
$s_2=s_1-\%rax=s_1-(\%rax-\%rax mod 16)=s_1-[8n+22-(8n+22)mod 16]=s_1-[8n+22-(16n/2)mod 16-22mod 16]=s_1-[8n+22-(16n/2)mod 16-6]$	\\
1)当n为非零偶数时	\\
$s_2=s_1-[8n+22-6]=s_1-8n-16$	\\
2)当n为奇数时	\\
$s_2=s_1-[8n+22-8-6]=s_1-8n-8$	\\[1ex]
\textbf{B.}	\\
$\%rax=s_2+7$	\\
$\%rax=\lfloor\%rax/8\rfloor$	\\
$p=8*\%rax$	\\
$p=8*\lfloor(s_2+7)/8\rfloor$	\\
1)当n为非零偶数时	\\
$p=8*\lfloor(s_1-8n-16+7)/8\rfloor=8*\lfloor(s_1-8n-9)/8\rfloor=8*\lfloor(s_1-1-8n-8)/8\rfloor=8*[\lfloor(s_1-1)/8\rfloor-(n+1)]$	\\
2)当n为奇数时	\\
$p=8*\lfloor(s_1-8n-8+7)/8\rfloor=8*\lfloor(s_1-8n-1)/8\rfloor=8*[\lfloor(s_1-1)/8\rfloor-n]$	\\[1ex]
\textbf{C.}	\\
$e_1=s_1-(p+8n)$	\\
$e_2=p-s_2$	\\
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{6em}<{\centering}m{6em}<{\centering}m{6em}<{\centering}m{6em}<{\centering}m{6em}<{\centering}m{6em}<{\centering}|}
\hline
n	&	$s_1$	&	$s_2$	&	p	&	$e_1$	&	$e_2$	\\
\hline
5	&	2065	&	2017	&	2024	&	1	&	7	\\
6	&	2064	&	2000	&	2000	&	16	&	0	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{D.}	\\
该段代码不为$s_2$提供任何对齐属性，使p对齐到到8	\\
\red{可以看到，$s_2$会保留$s_1$的偏移量为最接近16的倍数，并将p对齐到8的倍数，正是对8字节元素所要求的对齐方式}	\\[3ex]
\textbf{练习题3.50}	\\
映射关系如下	\\
val1$->$d	\\
val2$->$i	\\
val3$->$l	\\
val4$->$f	\\[3ex]
\newpage
\noindent\textbf{练习题.51}	\\
\renewcommand\arraystretch{1.4}
\begin{table}[htbp]
\centering
\begin{tabular}{|m{6em}<{\centering}|m{6em}<{\centering}|m{16em}<{\centering}|}
\hline
$T_x$	&	$T_y$	&	指令	\\
\hline
long	&	double	&	vcvtsi2sdq \%rdi,\%xmm0	\\
\hline
double	&	int	&	\blue{vcvttsd2si \%xmm0, \%eax}	\\
\hline
double	&	float	&	\blue{vmovddup \%xmm0, \%xmm0}	\\
	&		&	\blue{vcvtpd2psx \%xmm0, \%xmm0}	\\
\hline
long	&	float	&	\blue{vcvtsi2ssq \%rdi, \%xmm0, \%xmm0}	\\
\hline
float	&	long	&	\blue{vcvttss2siq \%xmm0, \%rax}	\\
\hline
\end{tabular}
\end{table}	\\[2ex]
\textbf{练习题3.52}	\\
\textbf{A.}	\\
a$->$\%xmm0,b$->$\%rdi,c$->$\%xmm1,d$->$\%esi	\\
\textbf{B.}	\\
a$->$\%edi,b$->$\%rsi,c$->$\%rdx,d$->$\%rcx	\\
\textbf{C.}	\\
a$->$\%rdi,b$->$\%xmm0,c$->$\%esi,d$->$\%xmm1	\\
\textbf{D.}	\\
a$->$\%xmm0,b$->$\%rdi,c$->$\%xmm1,d$->$\%xmm2	\\[3ex]
\textbf{练习题3.53}	\\
\textbf{1)}	\\
p in \%rdi,q in \%xmm0,r in \%rsi,s in \%xmm1	\\
arg1\_t$->$int	\\
arg2\_t$->$float	\\
arg3\_t$->$long	\\
arg4\_t$->$double	\\
\textbf{2)}	\\
p in \%rdi,q in \%rsi,r in \%xmm0,s in \%xmm1	\\
arg1\_t$->$int	\\
arg2\_t$->$long	\\
arg3\_t$->$float	\\
arg4\_t$->$double	\\[3ex]
\textbf{练习题3.54}	\\
double funct2(double w, int x, float y, long z);	\\
\{	\\
	\hspace*{2em}return (double)(y*x)-w/z;	\\
	\hspace*{2em}\red{ return (y*x)-w/z };	\\
\}	\\[3ex]
\textbf{练习题3.55}	\\
第一个值是低位字节(0x0)，第二个值是高位字节(0x40400000)，指数字段为0x404(1028),减去bias得到指数为5，小数字段为0x0,国此M=1,因此.LC3处表示数字32.0	\\[3ex]
\newpage
\noindent\textbf{练习题3.56}	\\
\textbf{A.} 符号位(最高位置0)置0	\\
\textbf{B.} 置x所有位为0	\\
\textbf{C.} 除符号位(最高位)所有位置0	\\[3ex]
\textbf{练习题3.57}	\\
double funct3(int *ap, double b, long c, float *dp)	\\
\{	\\
	\hspace*{2em}double x;	\\
	\hspace*{2em}float y;	\\
	\hspace*{2em}x=(double) *ap;	\\
	\hspace*{2em}y=(float) c;	\\
	\hspace*{2em}if(b$<=$x)	\\
	\hspace*{2em}\{		\\
	\hspace*{3em}*dp=2 * *dp;	\\
	\hspace*{3em}y=y+*dp;	\\
	\hspace*{3em}return (double) y;	\\
	\hspace*{2em}\}		\\
	\hspace*{2em}else	\\
	\hspace*{2em}\{		\\
	\hspace*{3em}*dp=*dp * y;	\\
	\hspace*{3em}return (double) *dp;	\\
	\hspace*{2em}\}		\\
\}	\\[3ex]
\textbf{练习题4.1}	\\
.pos 0x100 \# start code at address 0x100	\\
	\hspace*{1em}irmovq \$15,\%rbx	\blue{30f3 0f 00 00 00 00 00 00 00}\\
	\hspace*{1em}rrmovq \%rbx,\%rcx	\blue{2031}\\
loop:	\\
	\hspace*{1em}rmmovq \%rcx,-3(\%rbx)	\blue{4013 fd ff ff ff ff ff ff ff}\\
	\hspace*{1em}addq \%rbx,\%rcx	\blue{6031}\\
	\hspace*{1em}jmp loop	\blue{70 0c 01 00 00 00 00 00 00}\\[3ex]
\textbf{练习题4.2}	\\
\textbf{A.}	\\
.pos 0x100	\\
	\hspace*{1em}irmovq \$-4,\%rbx	\\
	\hspace*{1em}rmmovq \%rsi,0x800(\%rbx)	\\
\textbf{B.}	\\
.pos 0x200	\\
	\hspace*{1em}pushq \%rsi	\\
	\hspace*{1em}call proc	\\
	\hspace*{1em}halt		\\
proc:	\\
	\hspace*{1em}irmovq \$10,\%rbx	\\
	\hspace*{1em}ret		\\
\textbf{C.}	\\




\end{CJK}
\end{document}
